package com.pick.base.utils;

import java.util.regex.Pattern;

/**
 * 密码验证工具类
 */
public class PasswordValidator {

    /**
     * 密码复杂度正则表达式
     * 至少8位，包含大小写字母、数字和特殊字符
     */
    private static final String PASSWORD_PATTERN = 
        "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,}$";

    private static final Pattern pattern = Pattern.compile(PASSWORD_PATTERN);

    /**
     * 验证密码是否符合复杂度要求
     * 
     * @param password 密码
     * @return 是否有效
     */
    public static boolean isValid(String password) {
        if (password == null || password.trim().isEmpty()) {
            return false;
        }
        return pattern.matcher(password).matches();
    }

    /**
     * 获取密码复杂度要求说明
     * 
     * @return 密码要求说明
     */
    public static String getPasswordRequirements() {
        return "密码必须至少8位，包含大写字母、小写字母、数字和特殊字符(@#$%^&+=)";
    }

    /**
     * 验证密码强度
     * 
     * @param password 密码
     * @return 密码强度等级 (1-弱, 2-中, 3-强)
     */
    public static int getPasswordStrength(String password) {
        if (password == null || password.length() < 6) {
            return 0; // 无效密码
        }

        int score = 0;
        
        // 长度评分
        if (password.length() >= 8) score++;
        if (password.length() >= 12) score++;
        
        // 字符类型评分
        if (password.matches(".*[a-z].*")) score++; // 小写字母
        if (password.matches(".*[A-Z].*")) score++; // 大写字母
        if (password.matches(".*[0-9].*")) score++; // 数字
        if (password.matches(".*[@#$%^&+=!*()_+\\-=\\[\\]{};':,.<>?].*")) score++; // 特殊字符
        
        // 返回强度等级
        if (score <= 2) return 1; // 弱
        if (score <= 4) return 2; // 中
        return 3; // 强
    }

    /**
     * 获取密码强度描述
     * 
     * @param password 密码
     * @return 强度描述
     */
    public static String getPasswordStrengthDescription(String password) {
        int strength = getPasswordStrength(password);
        return switch (strength) {
            case 0 -> "无效";
            case 1 -> "弱";
            case 2 -> "中";
            case 3 -> "强";
            default -> "未知";
        };
    }
}